package util

import "fmt"

/**
DFA算法进行脏词过滤
*/

// 脏词树节点列表
// key为字符
// value为一个map[string]interface{}类型的map
//
var dirtyWordMap = make(map[string]interface{})

// 将传入的字符串拆解为节点入树
func addDirty2Map(value string) {
	// 转换成rune数组是为了适配中文
	str := []rune(value)
	curMap := dirtyWordMap
	for i := 0; i < len(str); i++ {
		if _, ok := curMap[string(str[i])]; !ok {
			// 当前字典没有数据，创建新节点
			newMap := make(map[string]interface{})
			newMap["isEnd"] = false
			curMap[string(str[i])] = newMap
			curMap = newMap
		} else {
			curMap = curMap[string(str[i])].(map[string]interface{})
		}
		if i == len(str)-1 { // 轮询结束,结尾标志设置为true
			curMap["isEnd"] = true
		}
	}
}

// FilterStr 过滤字符串
func FilterStr(value string) (word string) {
	// 同上，为了适配中文
	str := []rune(value)
	curMap := dirtyWordMap
	startIndex := -1
	flagIndex := -1
	for i := 0; i < len(str); i++ {
		if thisMap, ok := curMap[string(str[i])].(map[string]interface{}); ok { // 如果字符匹配脏词
			//记录脏词的位置
			flagIndex++
			if flagIndex == 0 {
				startIndex = i
			}
			// 将子节点赋值给当前节点
			curMap = curMap[string(str[i])].(map[string]interface{})
			//是否为脏词的最后一个文字
			if isEnd, _ := thisMap["isEnd"].(bool); isEnd {
				for y := startIndex; y < i+1; y++ {
					str[y] = '*'
				}
			}
		} else { //如果不是全匹配，则从起始位置+1开始
			if startIndex != -1 {
				i = startIndex + 1
			}
			//重置数据
			resetData(&curMap, &startIndex, &flagIndex)
		}
	}
	return string(str)
}

// 数据重置
func resetData(curMap *map[string]interface{}, startIndex *int, flagIndex *int) {
	*curMap = dirtyWordMap
	*startIndex = -1
	*flagIndex = -1
}

//Test  测试
func Test() {
	dirtyWord := []string{"a", "ab", "abc", "abcd"}
	for _, value := range dirtyWord {
		addDirty2Map(value)
	}
	fmt.Println(dirtyWordMap)
	fmt.Println(FilterStr("abcdcddab"))
}
